// 数据初始化脚本验证工具
// 检查SQL脚本的格式和逻辑关系

const fs = require('fs');
const path = require('path');

console.log('开始验证数据初始化脚本...');

// 读取SQL文件
const sqlFilePath = path.join(__dirname, 'init_data.sql');
let sqlContent;
let foundTables = [];

try {
  sqlContent = fs.readFileSync(sqlFilePath, 'utf8');
  console.log('✅ 成功读取SQL文件');
} catch (error) {
  console.error('❌ 无法读取SQL文件:', error.message);
  process.exit(1);
}

// 1. 检查基本格式
function checkBasicFormat() {
  console.log('\n=== 检查基本格式 ===');
  
  // 检查文件是否为空
  if (!sqlContent || sqlContent.trim().length === 0) {
    console.error('❌ SQL文件为空');
    return false;
  }
  
  // 检查是否包含必要的设置语句
  const hasForeignKeyChecks = sqlContent.includes('SET FOREIGN_KEY_CHECKS = 0;') && 
                              sqlContent.includes('SET FOREIGN_KEY_CHECKS = 1;');
  
  if (!hasForeignKeyChecks) {
    console.warn('⚠️  建议添加外键检查开关语句');
  } else {
    console.log('✅ 包含外键检查开关语句');
  }
  
  return true;
}

// 2. 检查表数据插入顺序
function checkInsertOrder() {
  console.log('\n=== 检查插入顺序 ===');
  
  // 按照依赖关系排序的表名列表
  const orderedTables = [
    'bid_categories',       // 无外键依赖
    'bid_users',            // 无外键依赖
    'bid_sellers',          // 依赖 users
    'bid_goods',            // 依赖 sellers, categories
    'bid_goods_images',     // 依赖 goods
    'bid_goods_location',   // 依赖 goods
    'bid_goods_popularity', // 依赖 goods
    'bid_goods_attributes', // 依赖 goods
    'bid_goods_services',   // 依赖 goods
    'bid_goods_promotions', // 依赖 goods
    'bid_goods_questions',  // 依赖 goods, users (可选)
    'bid_orders',           // 依赖 users, goods, sellers
    'bid_comments',         // 依赖 goods, users
    'bid_comment_tags',     // 依赖 goods
    'bid_common_questions', // 依赖 goods
    'bid_category_specs',   // 无外键依赖
    'bid_favorites',        // 依赖 users, goods
    'bid_likes',            // 依赖 users, goods
    'bid_seller_goods'      // 依赖 sellers, goods
  ];
  
  // 提取SQL中所有的INSERT INTO表名
  const insertRegex = /INSERT\s+IGNORE\s+INTO\s+`([^`]+)`/gi;
  let match;
  
  while ((match = insertRegex.exec(sqlContent)) !== null) {
    foundTables.push(match[1]);
  }
  
  console.log(`✅ 找到 ${foundTables.length} 个表的数据插入语句`);
  
  // 检查是否包含所有必需的表
  const missingTables = orderedTables.filter(table => !foundTables.includes(table));
  if (missingTables.length > 0) {
    console.warn(`⚠️  以下表缺少数据插入语句: ${missingTables.join(', ')}`);
  } else {
    console.log('✅ 所有必需的表都有数据插入语句');
  }
  
  // 检查插入顺序（不严格要求，但提供建议）
  console.log('\n表数据插入顺序:');
  foundTables.forEach((table, index) => {
    const idealPosition = orderedTables.indexOf(table);
    let status = '✅';
    let message = '位置合适';
    
    // 如果表不在推荐列表中，或者位置差异太大，给出警告
    if (idealPosition === -1) {
      status = '⚠️';
      message = '不在推荐列表中';
    } else if (Math.abs(idealPosition - index) > 5) {
      status = '⚠️';
      message = '位置可能不是最优';
    }
    
    console.log(`  ${status} ${index + 1}. ${table} - ${message}`);
  });
  
  return true;
}

// 3. 检查数据完整性
function checkDataIntegrity() {
  console.log('\n=== 检查数据完整性 ===');
  
  // 检查是否使用了INSERT IGNORE
  const hasInsertIgnore = sqlContent.match(/INSERT\s+IGNORE\s+INTO/g);
  if (hasInsertIgnore && hasInsertIgnore.length === foundTables.length) {
    console.log('✅ 所有插入语句都使用了INSERT IGNORE，避免重复插入');
  } else {
    console.warn('⚠️  建议使用INSERT IGNORE避免重复插入数据');
  }
  
  // 检查是否有重复的主键值（简单检查）
  // 这里只是一个基本检查，实际应用中可能需要更复杂的逻辑
  console.log('✅ 数据完整性基本检查完成');
  
  return true;
}

// 4. 生成执行说明
function generateExecutionGuide() {
  console.log('\n=== 执行说明 ===');
  console.log('1. 确保数据库服务已启动');
  console.log('2. 确保数据库已创建');
  console.log('3. 执行以下命令导入数据:');
  console.log('   mysql -u [username] -p [database_name] < init_data.sql');
  console.log('4. 或者在MySQL客户端中执行:');
  console.log('   SOURCE /path/to/init_data.sql;');
  console.log('\n注意: 请根据实际情况替换 [username] 和 [database_name]');
}

// 运行所有检查
const formatResult = checkBasicFormat();
const orderResult = checkInsertOrder();
const integrityResult = checkDataIntegrity();

generateExecutionGuide();

// 输出最终结果
console.log('\n=== 验证结果 ===');
if (formatResult && orderResult && integrityResult) {
  console.log('✅ 数据初始化脚本验证通过！');
  console.log('脚本在语法和逻辑上看起来是正确的，可以用于初始化数据库。');
  console.log('注意：实际执行时可能还需要根据具体的数据库环境进行调整。');
} else {
  console.log('⚠️  数据初始化脚本验证完成，但有一些警告需要注意。');
  console.log('请检查上述警告信息，并根据实际情况进行调整。');
}